package org.soderiakelvy.controller.sujeto;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.soderiakelvy.controller.util.Constante;
import org.soderiakelvy.model.domain.ComercializacionMesVencidoVO;
import org.soderiakelvy.model.domain.DesProdTipoCliVO;
import org.soderiakelvy.model.domain.ProductoVO;
import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.domain.SujetoVO;
import org.soderiakelvy.model.service.ProductoServicio;
import org.soderiakelvy.model.service.SucursalServicio;
import org.soderiakelvy.model.service.SujetoServicio;
import org.soderiakelvy.model.service.imp.ProductoServicioImp;
import org.soderiakelvy.model.service.imp.SucursalServicioImp;
import org.soderiakelvy.model.service.imp.SujetoServicioImpl;
import org.soderiakelvy.model.util.ConstantModel;
@ManagedBean
@ViewScoped
public class SujetoEmpresaMesVencido implements Serializable{
	private static final long serialVersionUID = 6772671496216656787L;
	
	//-- VO & SERVICE ---
	private SucursalVO sucursal;
	private SujetoVO sujeto;
	private ComercializacionMesVencidoVO comercializacionMesVencido;
	private SucursalServicio service = new SucursalServicioImp();
	//-------------------
	private List<DesProdTipoCliVO> productosDisponibles;
	private List<ComercializacionMesVencidoVO> productosComercializados;
	private String tipoCrud;
	
	//--- CONSTRUCTOR ---
	public SujetoEmpresaMesVencido(){
		sucursal = new SucursalVO();
		comercializacionMesVencido = new ComercializacionMesVencidoVO();
		productosComercializados = new ArrayList<ComercializacionMesVencidoVO>();
		getTipoCrud();
	}
	
	private void getTipoCrud(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		tipoCrud = (String) sessionParams.get("tipoCrudComercializacionMesVencido");
		sucursal = (SucursalVO) sessionParams.get("sucursalUpdateComercializacioinMesVencido");
		sessionParams.remove("tipoCrudComercializacionMesVencido");
		sessionParams.remove("sucursalUpdateComercializacioinMesVencido");
		if(tipoCrud != null && sucursal != null){
			sujeto = sucursal.getSujeto();
			buscarProductosDisponiblesAndComercializados(tipoCrud, sujeto);
		}else{
			System.out.println("Hubo un error al instaciar la clase. Error de navegacion");
		}
	}
	//-------------------
	
	/**
	 * Asigna una comercializacion a una sucursal del tipo Mes Vencido
	 */
	public void btnAsignarComercializacion(ComercializacionMesVencidoVO comercializacionParaAsignar){		
		comercializacionParaAsignar.setSucursal(getSucursal());
		if(!service.insertComercializacionMesVencidoVO(comercializacionParaAsignar).equals(ConstantModel.SUCCESS)){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL,"Error de Acceso a Dato", "Sugrio un error al guardar la comercializacion mes vencido a la sucursal."));
		}else{
			productosComercializados = service.getProductosComercializadosAMesVencido(getSucursal());
			productosDisponibles.remove(comercializacionParaAsignar.getDescuentoProducto());
			comercializacionMesVencido = new ComercializacionMesVencidoVO();
		}
	}
	
	
	public void btQuitarProductoComercializado(ComercializacionMesVencidoVO comercializacionParaQuitar){
		if(!service.deleteComercializacionMesVencidoVO(comercializacionParaQuitar).equals(ConstantModel.SUCCESS)){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Error de Base de Dato", "Hubo un error al eliminar el producto asignado."));
			System.out.println("Hubo un error al guardar la comercializacion mes vencido");
		}else{
			productosComercializados = service.getProductosComercializadosAMesVencido(getSucursal());
			productosDisponibles.add(comercializacionParaQuitar.getDescuentoProducto());
		}
	}
	
	public String bntTerminar(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		sessionParams.put("sujetoEmpresaUpdate", sujeto);
		String result = "sujetoEmpresaSucursalesList.xhtml";
		return result;
	}
	
	/**
	 * Busca todo los productos disponibles y los productos que estan comercializados
	 * @param tipoCrud
	 * @param sujeto
	 */
	private void buscarProductosDisponiblesAndComercializados(String tipoCrud,SujetoVO sujeto){
		SujetoServicio sujetoService = new SujetoServicioImpl();
		productosDisponibles = sujetoService.getProductosConDescuentoByTipoCliente(sujeto.getTipoCliente());
		if(tipoCrud.equals(Constante.SUJETO_EMPRESA_COMERCIALIZACION_MES_VENCIDO_UPDATE)){
			// --- Modificacion
			productosComercializados = service.getProductosComercializadosAMesVencido(getSucursal());
			for(ComercializacionMesVencidoVO cmv: productosComercializados){
				productosDisponibles.remove(cmv.getDescuentoProducto());
			}
		}else{
			productosComercializados = new ArrayList<ComercializacionMesVencidoVO>();
		}
	}
		
	//--- GET AND SET ---
	public SucursalVO getSucursal() {
		return sucursal;
	}
	
	public SujetoVO getSujeto(){
		return sujeto;
	}

	public ComercializacionMesVencidoVO getComercializacionMesVencido() {
		return comercializacionMesVencido;
	}
	
	public List<DesProdTipoCliVO> getProductosDisponibles(){
		return productosDisponibles;
	}
	
	public List<ComercializacionMesVencidoVO> getProductosComercializados(){
		return productosComercializados;
	}
	//-------------------
}
